﻿using System;
using System.Collections.Generic;
using System.Linq;
using Rsdn.SmartApp;

namespace Rsdn.Janus
{
	internal class JBrowserActiveMessageService : IActiveMessagesService
	{
		private readonly IServiceProvider _provider;
		private readonly IBrowserFormService _browserFormService;

        /// <summary>
        /// Initializes a new instance of the <see cref="JBrowserActiveMessageService"/> class.
        /// </summary>
        /// <param name="provider">The provider.</param>
		public JBrowserActiveMessageService(IServiceProvider provider)
		{
			_provider = provider;
			if (provider == null)
				throw new ArgumentNullException("provider");

			_browserFormService = provider.GetRequiredService<IBrowserFormService>();
		}

        /// <summary>
        /// Gets the active message id.
        /// </summary>
        /// <returns></returns>
		private int? GetActiveMessageId()
		{
			var info = JanusProtocolInfo.Parse(_browserFormService.Url);
			return info != null
				   && info.ResourceType == JanusProtocolResourceType.Message
				   && info.IsId
			   ? (int?)info.Id : null;
		}

		#region IActiveMessageService Members

        /// <summary>
        /// Должно принудительно вызывать обновление комманд 'имитируя' изменение сообщение
        /// Например при выделений всех сообщений в гриде команды должны 'пересчитаться', но сообщения фактически не изменились
        /// </summary>
	    public void UpdateMessageState()
	    {
	        throw new NotImplementedException();
	    }

        /// <summary>
        /// Активные сообщения.
        /// </summary>
        /// <value>The active messages.</value>
	    public IEnumerable<IMsg> ActiveMessages
		{
			get
			{
				var msgId = GetActiveMessageId();
				if (msgId != null)
				{
					var msg = DatabaseManager.GetMessageWithForum(_provider, msgId.Value);
					if (msg != null)
						return new[] { msg };
				}
				return Enumerable.Empty<IMsg>();
			}
		}

        /// <summary>
        /// Возникает когда активные сообщения изменились.
        /// </summary>
		public event EventHandler ActiveMessagesChanged
		{
			add { _browserFormService.Navigated += value; }
			remove { _browserFormService.Navigated -= value; }
		}

		#endregion
	}
}
